#ifndef HUFFMAN_H_
#define HUFFMAN_H_

/*
 * huffman.h
 */

#include <cstdlib>
#include <cstdio>

#define RANGO 256
#define MAXIMO (2*RANGO+1)  // numero maximo para un nodo
#define INTERNO -0xA        // "caracter" para nodos internos
#define ESCAPE -0xB         // "caracter" para nodo escape
typedef struct nodo tNodo;

struct struct_Huffman {
		int32_t buffer_huffman;  // buffer de bits para Huffman (32 bits)
		int contador_bits;  // contador para buffer_huffman
		int numero;  // numero para asignar de forma descendente a los nodos
		tNodo *raiz;  // punteros al nodo raiz
		tNodo *escape;  // punteros al nodos escape
		tNodo *nodos[MAXIMO];  // array de punteros a todos los nodos del arbol, accesible por numero
		tNodo *hojas[RANGO];  // array de punteros a las hojas del arbol, accesible por caracter
		int frecuencias[RANGO];  // array de frecuencias para cada caracter, accesible por caracter
};

void huffman_inicializar(struct_Huffman * const huffman);

void huffman_comprimir(struct_Huffman * const huffman, FILE *archivoSalidaHandler, unsigned char * const bloque, unsigned int longitud);

void huffman_finalizar(struct_Huffman * const huffman, FILE *archivoSalidaHandler);

void huffman_descomprimir(struct_Huffman * const huffman, FILE *archivoEntradaHandler, unsigned char * const bloque, unsigned int longitud);

void huffman_destruir(struct_Huffman * const huffman);

#endif /* HUFFMAN_H_ */
